package lucius.work.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import lucius.work.dao.IBaseDao;

@Repository("baseDao")
public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T> {

	/**
	 * @Autowired 自动装配 相当于get() set()，注入SessionFactory对象
	 */
	SessionFactory sessionFactory;
	
	@Autowired
	public void setMySessionFactory(SessionFactory sessionFactory) {
		super.setSessionFactory(sessionFactory);
	}
	
	//获得Session
	public Session getSession(){
		 Session session  = this.getHibernateTemplate().getSessionFactory().getCurrentSession();
		 return session;
	}

	/**
	 * 根据实体的ID属性来加载实体
	 */
	// @SuppressWarnings("unchecked")的作用告诉编辑器对被批注的元素内部的某些警告保持静默，常用于List<数据类型>泛型
	@Override
	@SuppressWarnings("unchecked")
	public T get(Class<T> entityClazz, Serializable id) {
		return (T) getSession().get(entityClazz, id);
		//openSeesion();获得session 对数据库进行CRUD操作,entityClazz 根据关系映射,
		//获得entity 和 数据库中table的关系，然后根据id获取数据
	}

	/**
	 * 保存数据
	 */
	@Override
	public Serializable save(T entity) {
		/**
		 * 通过测试类去直接实例化DAO层，对数据库进行操作发生错误 错误 代码：
		 * org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
		 * 而 通过测试类去实例化Service层，对数据库操作成功
		 * 
		 * 保留一个疑问
		 */
		return getSession().save(entity);
	}

	/**
	 * 更新数据
	 */
	@Override
	public void update(T entity) {

		getSession().saveOrUpdate(entity);
	}

	/**
	 * 删除数据
	 */
	@Override
	public void delete(T entity) {

		getSession().delete(entity);
		
	}

	/**
	 * 根据实体ID删除数据
	 */
	@Override
	public void delete(Class<T> entityClazz, Serializable id) {

		delete(entityClazz, new Serializable[] { id });
	}

	/**
	 * 根据实体ID数组删除数据
	 */
	@Override
	public void delete(Class<T> entityClazz, Serializable[] ids) {

		// 遍历删除
		for (Serializable serializable : ids) {
			delete(get(entityClazz, serializable));
		}
	}

	/**
	 * 根据hql查询数据
	 */
	@Override
	@SuppressWarnings("unchecked")
	public List<T> find(String hql) {

		return getSession().createQuery(hql).list();
	}

	/**
	 * 获取所有数据
	 */
	@Override
	public List<T> findAll(Class<T> entityClazz) {

		return find("SELECT en FROM " + entityClazz.getSimpleName() + " en");
	}

	/**
	 * 获取数据总数
	 */
	@Override
	public long findCount(Class<T> entityClazz) {

		List<?> l = find("SELECT COUNT(*) FROM " + entityClazz.getSimpleName());
		// 取得查询得到的实体总数
		if(l != null && l.size() ==1){
			return (Long)l.get(0);
		}
		return 0;
	}


}
